package ModuleFour.task03;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.Callable;

public class CopyContent implements Callable {

    @Override
    public Object call() throws Exception {
        copyDirectory("d:/文件夹1", "e:/文件夹1");
        return 0;
    }

    //自定义复制文件夹的方法
    public static void copyDirectory (String oldPath, String newPath) throws IOException {

        //创建一个File类型的对象与旧文件路径相关联
        File file = new File(oldPath);
        //将文件夹的路径放在一个数组中
        //String[] list()返回一个字符串数组，用于命名此抽象路径名表示的目录中的文件和目录
        String[] filePath = file.list();

        if (!(new File(newPath)).exists()) {
            //创建一个路径下的文件夹
            (new File(newPath)).mkdir();
        }
        //循环得到文件路径的长度
        for (int i = 0; i < filePath.length; i++) {

            if ((new File(oldPath + "\\" + filePath[i])).isDirectory()) {
                //递归的思想
                copyDirectory(oldPath  + "\\" + filePath[i], newPath  + "\\" + filePath[i]);
            }

            if (new File(oldPath  + file.separator + filePath[i]).isFile()) {
                copyFile(oldPath + "\\" + filePath[i], newPath + "\\" + filePath[i]);
            }

        }
    }

    //自定义复制文件的方法
    public static void copyFile(String oldPath, String newPath) throws IOException {

        FileInputStream fis = null;
        FileOutputStream fos = null;

        File oldfile = new File(oldPath);
        File newfile = new File(newPath);

        try {
            //创建FileInputStream类型的对象与旧文件路劲关联
            fis = new FileInputStream(oldfile);
            //创建FileOutputStream类型的对象与新文件路劲关联
            fos = new FileOutputStream(newfile);
            System.out.println("正在玩命的拷贝！");

            //准备一个相对适当的缓冲区，分多次将文件拷贝完成
            //缓冲区一般是1024的倍数
            byte[] bArr = new byte[1024];
            int res = 0;
            while ((res = fis.read(bArr)) != -1) {
                fos.write(bArr,0,res);
            }
            System.out.println("文件拷贝成功！");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、关闭流对象并释放有关资源
            if (null != fos) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fis) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

